
package com.zhike.service.file;

import java.io.File;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;

import javax.annotation.Resource;

import com.eva.epc.common.util.se.ImgEqualScaleAndCutHelper;
import com.zhike.common.conf.IMBaseConf;
import com.zhike.common.constant.Constants;

import lombok.extern.slf4j.Slf4j;

/**
 * 好友备注中的图片文件上传处理实现类。
 * 
 * @author Jack Jiang
 * @sin 7.3
 */
// TODO: 此上传接口已写好，但因开发计划搁置，ios、andriod客户端暂未实现好友备注中设置图片的功能
@Slf4j
public class FriendRemarkPhotoUploader extends UploaderRoot {

	@Resource
	private IMBaseConf baseConf;

	@Override
	public String getFileSaveDir() {
		return baseConf.getDIR_USER_UPLOAD();
	}

	@Override
	public void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
		String myUid = (String) parametersFromClient.get("my_uid");
		String friendUid = (String) parametersFromClient.get("friend_uid");
		// 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
		String fileName = (String) parametersFromClient.get("file_name");

		log.debug("[" + getDebugTAG() + "] 用户" + myUid + "的好友" + friendUid + "备注图片文件" + fileName
				+ "数据上传成功，马上处理其它业务逻辑...");

		// 客户端传过来的数据（参数）的合法性检查
		if (myUid != null && friendUid != null && fileName != null) {
			String uploadPath = getFileSaveDir();
			// 图片文件已经保存到的磁盘绝对路径
			File filePath = new File(uploadPath + File.separator + fileName);

			if (filePath.exists()) {
				// 生成原图的缩略图并存到磁盘
				File thumbnailFilePath = new File(uploadPath + File.separator + "th_" + fileName);
				// 如果该md5文件名命名（其实此md5码就是文件数据的指纹）存在，即意味着不需要写入磁盘了
				if (!thumbnailFilePath.exists()) {
					// 如果是照片则启用新的等经缩放并裁切的算法（此算法自2014-03-29实施），算法将保证缩略图的生成不变形
					try {
						ImgEqualScaleAndCutHelper.saveImageAsJpg(filePath.getAbsolutePath(),
								thumbnailFilePath.getAbsolutePath(), 640, 640 // 生成的缩略图最大尺寸
						);
					} catch (Exception e) {
						log.warn("[" + getDebugTAG() + "] 图片缩略图生成（新算法不可靠，需优化？）出错了！", e);
					}
				}

				// 上传完成后更新数据库中该条好友记录中的备注照片文件字段
				// LogicProcessor2.db.update("update missu_roster set pic_file_name=? where
				// user_uid=? and friend_user_uid=?", new Object[]{fileName, myUid, friendUid},
				// true);
			} else {
				log.error("[" + getDebugTAG() + "] 用户" + myUid + "的好友" + friendUid + "备注图片文件" + fileName
						+ "为何不存在？(绝对路径=" + filePath.getAbsolutePath() + ")");
			}
		} else {
			throw new Exception("[" + getDebugTAG() + "] 无效的参数：myUid=" + myUid + ", friendUid=" + friendUid
					+ ", fileName=" + fileName + ".");
		}
	}

	@Override
	public void onUploadFailure(Exception ex) {
		log.error("[" + getDebugTAG() + "] 处理好友备注图片上传时出错了，" + ex.getMessage(), ex);
	}

	@Override
	public String getDebugTAG() {
		return "HTTP好友备注图片上传";
	}

	@Override
	public String getPathTag() {
		return Constants.UPLOAD_FRIEND + "/remark/";
	}

	@Override
	public Set<String> getDetectedTypes() {
		Set<String> allowExtensions = new HashSet<>();
		allowExtensions.add("txt");
		allowExtensions.add("pdf");
		allowExtensions.add("docx");
		return allowExtensions;
	}
}
